package utils

import (
	"crypto/tls"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	dm20151123 "github.com/alibabacloud-go/dm-20151123/v2/client"
	"github.com/alibabacloud-go/tea/tea"
	"gopkg.in/gomail.v2"
	"strings"
)

func RegisterSendEmail(toEmail, title, body string) error {
	config := &openapi.Config{
		// 必填，您的 AccessKey ID
		AccessKeyId: tea.String(ServerConf.Phone.AccessKeyId),
		// 必填，您的 AccessKey Secret
		AccessKeySecret: tea.String(ServerConf.Phone.AccessKeySecret),
	}
	// Endpoint 请参考 https://api.aliyun.com/product/Dm
	config.Endpoint = tea.String("dm.aliyuncs.com")
	client := &dm20151123.Client{}
	client, _err := dm20151123.NewClient(config)
	if _err != nil {
		return _err
	}
	//SingleSendMail
	request := &dm20151123.SingleSendMailRequest{}
	request.SetAccountName("zxz@message.zhaixiaozhi.com")
	request.SetFromAlias("宅小职") //发信人昵称，长度小于15个字符。
	request.SetAddressType(1)   //0：为随机账号 1：为发信地址
	request.SetTagName("register")
	request.SetReplyToAddress(true) // 是否启用管理控制台中配置好回信地址（状态须验证通过），取值范围是字符串true或者false
	request.SetToAddress(toEmail)
	//可以给多个收件人发送邮件，收件人之间用逗号分开，目标地址，多个 email 地址可以用逗号分隔，最多100个地址（支持邮件组）。
	//request.setToAddress("邮箱1,邮箱2");
	request.SetSubject(title)
	//注意：文本邮件的大小限制为3M，过大的文本会导致连接超时或413错误
	request.SetHtmlBody(body)

	_, err := client.SingleSendMail(request)
	if err != nil {
		return err
	}
	return nil
}

func SendEmail(toEmail, title, body string) error {
	config := &openapi.Config{
		// 必填，您的 AccessKey ID
		AccessKeyId: tea.String(ServerConf.Phone.AccessKeyId),
		// 必填，您的 AccessKey Secret
		AccessKeySecret: tea.String(ServerConf.Phone.AccessKeySecret),
	}
	// Endpoint 请参考 https://api.aliyun.com/product/Dm
	config.Endpoint = tea.String("dm.aliyuncs.com")
	client := &dm20151123.Client{}
	client, _err := dm20151123.NewClient(config)
	if _err != nil {
		return _err
	}
	//SingleSendMail
	request := &dm20151123.SingleSendMailRequest{}
	request.SetAccountName("promotion@message.zhaixiaozhi.com")
	request.SetFromAlias("宅小职") //发信人昵称，长度小于15个字符。
	request.SetAddressType(1)   //0：为随机账号 1：为发信地址
	request.SetTagName("register")
	request.SetReplyToAddress(true) // 是否启用管理控制台中配置好回信地址（状态须验证通过），取值范围是字符串true或者false
	request.SetToAddress(toEmail)
	//可以给多个收件人发送邮件，收件人之间用逗号分开，目标地址，多个 email 地址可以用逗号分隔，最多100个地址（支持邮件组）。
	//request.setToAddress("邮箱1,邮箱2");
	request.SetSubject(title)
	//注意：文本邮件的大小限制为3M，过大的文本会导致连接超时或413错误
	request.SetHtmlBody(body)

	_, err := client.SingleSendMail(request)
	if err != nil {
		return err
	}
	return nil
}

func BatchSendEmail(toEmail []string, title, body string) error {
	pageSize := 100
	if len(toEmail) < pageSize {
		result := strings.Join(toEmail, ",")
		return SendEmail(result, title, body)
	} else {
		emailLength := len(toEmail) / pageSize
		for i := 0; i < emailLength; i++ {
			slice := toEmail[i*pageSize : (i*pageSize)+pageSize]
			result := strings.Join(slice, ",")
			SendEmail(result, title, body)
		}
		//剩余条数
		if len(toEmail)-(emailLength*pageSize) > 0 {
			slice := toEmail[emailLength*pageSize:]
			result := strings.Join(slice, ",")
			return SendEmail(result, title, body)
		}
	}
	return nil
}

func SendEmailOld(toEmail, title, body string) error {
	// 1. 首先构建一个 Message 对象，也就是邮件对象
	m := gomail.NewMessage()
	// 2. 填充 From，注意第一个字母要大写
	m.SetAddressHeader("From", ServerConf.Email.Base, ServerConf.Email.FromName)
	// 3. 填充 To
	m.SetHeader("To", toEmail)
	// 4. 如果需要可以填充 cc，也就是抄送
	//msg.SetHeader("Cc", "cc_address@example.com")
	// 5. 设置邮件标题
	m.SetHeader("Subject", title)
	// 6. 设置要发送的邮件正文
	// 第一个参数是类型，第二个参数是内容
	// 如果是 html，第一个参数则是 `text/html`
	m.SetBody("text/html", body)
	// 7. 添加附件，注意，这个附件是完整路径
	//msg.Attach("/Users/yufei/Downloads/1.jpg")

	// 到此，邮件消息构建完毕
	// 8. 创建 smtp 实例
	// 如果你的阿里云企业邮箱则是密码，否则一般情况下国内国外使用的都是授权码
	d := gomail.NewDialer(ServerConf.Email.Host, ServerConf.Email.Port, ServerConf.Email.Base, ServerConf.Email.Auth)
	// 9. 设置TLS
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
	// 10. 发送邮件，连接邮件服务器，发送完就关闭
	return d.DialAndSend(m)
}
